package com.cskaoyan.javase.object._6clone.cloneable;

import sun.util.resources.cldr.es.CalendarData_es_PY;

/**
 * 实现接口,由于接口往往存在抽象方法,所以实现接口会报错,要求实现抽象方法
 * 但是实现java.lang.Cloneable并没有报错,为什么呢?
 * 实际上,java.lang.Cloneable是一个空接口
 *
 * 让一个类实现空接口,意义是什么呢?为什么要这么做呢?(扩展)
 * 主要的目的是为了配合instanceof做判断,从而完成一些操作
 * 引用 instanceof 接口名
 * 表示判断引用指向的对象是否是接口的子类对象
 * 一个类实现了空接口,虽然从成员上说,没有新增任何成员,但是它的数据类型发生了变化:
 *      从原先不是这个接口的子类-->变成了它的子类
 * 这就是空接口的作用
 * 某个类实现空接口,起着"标记"的作用,这种类型的空接口也叫"标记接口"
 * 实现它们,往往意味着允许做一些操作
 * 底层是使用instanceof来判断
 *
 * @since 17:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        judgeObjectImplInterfaceIA(new B());
    }

    // 该方法用于判断,某个对象是否实现了接口IA
    public static void judgeObjectImplInterfaceIA(Object o) {
        if (o instanceof IA) {
            System.out.println("传入对象的类型实现了接口IA");
            System.out.println("如果是克隆操作,这里就表示实现了空接口,允许做克隆操作");
            return;
        }
        System.out.println("传入对象的类型没有接口IA");
        System.out.println("如果是克隆操作,这里就表示没有实现空接口,禁止做克隆操作,而且要抛出异常");

    }

}

interface IA {
}

class B {
}

class A implements Cloneable {
}